package com.banban.user.service.impl;

import com.banban.user.domain.PromptTemplate;
import com.banban.user.dto.*;
import com.banban.user.exception.BusinessException;
import com.banban.user.mapper.PromptTemplateMapper;
import com.banban.user.service.PromptTemplateService;
import com.banban.user.util.UniqueIDUtil;
import com.banban.user.vo.PromptTemplateVO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service
@Slf4j
public class PromptTemplateServiceImpl extends ServiceImpl<PromptTemplateMapper, PromptTemplate> implements PromptTemplateService {

    @Resource
    private PromptTemplateMapper mapper;

    @Override
    public PromptTemplateVO add(PromptTemplateAddDTO dto) {
        List<PromptTemplate> promptTemplates = mapper.selectByName(dto.getName());
        if (promptTemplates != null && !promptTemplates.isEmpty()) {
            throw new BusinessException("提示模板名称重复");
        }

        PromptTemplate promptTemplate = new PromptTemplate();
        promptTemplate.setId(String.valueOf(UniqueIDUtil.generateId()));
        promptTemplate.setName(dto.getName());
        promptTemplate.setPromptDesc(dto.getPromptDesc());
        promptTemplate.setClassify(dto.getClassify());
        promptTemplate.setStatus(0);
//        promptTemplate.setCreateBy(StpUtil.getLoginIdAsString());
        super.save(promptTemplate);
        PromptTemplateVO promptTemplateVO = new PromptTemplateVO();
        promptTemplateVO.setClassify(promptTemplate.getClassify());
        promptTemplateVO.setPromptDesc(promptTemplate.getPromptDesc());
        promptTemplateVO.setName(promptTemplate.getName());
        promptTemplateVO.setId(promptTemplate.getId());
        return promptTemplateVO;
    }

    @Override
    public PromptTemplateVO getPromptById(String id) {
        PromptTemplate promptTemplate = mapper.selectById(id);
        if (promptTemplate != null && promptTemplate.getDelFlag() == 1) {
            PromptTemplateVO promptTemplateVO = new PromptTemplateVO();
            promptTemplateVO.setClassify(promptTemplate.getClassify());
            promptTemplateVO.setPromptDesc(promptTemplate.getPromptDesc());
            promptTemplateVO.setName(promptTemplate.getName());
            promptTemplateVO.setStatus(promptTemplate.getStatus());
            promptTemplateVO.setId(promptTemplate.getId());
            promptTemplateVO.setPrompt(promptTemplate.getPrompt());
            promptTemplateVO.setCreateTime(promptTemplate.getCreateTime());
            promptTemplateVO.setPrologue(promptTemplate.getPrologue());
            return promptTemplateVO;
        }
        return null;
    }

    @Override
    public void updatePromptTemplate(PromptTemplateUpdateDTO dto) {
        String id = dto.getId();
        PromptTemplate promptTemplate = mapper.selectById(id);
        if (promptTemplate == null){
            throw new BusinessException("模板不存在");
        }
        if (promptTemplate.getDelFlag() == 0){
            throw new BusinessException("模板已被删除");
        }
        if(promptTemplate.getStatus() == 1){
            throw new BusinessException("已发布模板无法修改");
        }
        List<PromptTemplate> promptTemplates = mapper.selectByName(dto.getName());
        if (promptTemplates != null && !promptTemplates.isEmpty() && !promptTemplates.get(0).getId().equals(id)) {
            throw new BusinessException("提示模板名称重复");
        }
        PromptTemplate update = new PromptTemplate();
        update.setId(id);
        update.setName(dto.getName());
        update.setPromptDesc(dto.getPromptDesc());
        update.setClassify(dto.getClassify());
//        update.setUpdateBy(StpUtil.getLoginIdAsString());
        mapper.updateById(update);
    }

    @Override
    public void delete(String id) {
        PromptTemplate promptTemplate = mapper.selectById(id);
        if (promptTemplate == null){
            throw new BusinessException("模板不存在");
        }
        if (promptTemplate.getDelFlag() == 0){
            throw new BusinessException("模板已被删除");
        }
        if(promptTemplate.getStatus() == 1){
            throw new BusinessException("已发布模板无法删除");
        }
        PromptTemplate update = new PromptTemplate();
        update.setId(id);
        update.setDelFlag(0);
        mapper.updateById(update);
    }

    @Override
    public IPage<PromptTemplateVO> selectPage(PromptTemplatePageDTO dto) {
        QueryWrapper<PromptTemplate> queryWrapper = new QueryWrapper<>();
        if (dto.getName() != null){
            queryWrapper.like("name",dto.getName());
        }
        if (dto.getClassify() != null){
            queryWrapper.eq("classify",dto.getClassify());
        }
        queryWrapper.orderByDesc("create_time");
        queryWrapper.eq("del_flag",1);
        Page<PromptTemplate> page = this.page(dto.getQueryPage(), queryWrapper);
        return page.convert(item -> {
            PromptTemplateVO promptTemplateVO = new PromptTemplateVO();
            promptTemplateVO.setId(item.getId());
            promptTemplateVO.setName(item.getName());
            promptTemplateVO.setPromptDesc(item.getPromptDesc());
            promptTemplateVO.setClassify(item.getClassify());
            promptTemplateVO.setStatus(item.getStatus());
            promptTemplateVO.setCreateTime(item.getCreateTime());
            return promptTemplateVO;
        });
    }

    @Override
    public void publish(PublishPromptTemplateDTO dto) {
        String id = dto.getId();
        PromptTemplate promptTemplate = mapper.selectById(id);
        if (promptTemplate == null){
            throw new BusinessException("模板不存在");
        }
        if (promptTemplate.getDelFlag() == 0){
            throw new BusinessException("模板已被删除");
        }
        if (promptTemplate.getStatus() == 0 && dto.getStatus() == 0){
            throw new BusinessException("模板已下架");
        }
        if (promptTemplate.getStatus() == 1 && dto.getStatus() == 1){
            throw new BusinessException("模板已发布");
        }
        PromptTemplate update = new PromptTemplate();
        update.setId(id);
        update.setStatus(dto.getStatus());
        mapper.updateById(update);
    }

    @Override
    public void updateDetail(PromptUpdateDetailDTO dto) {
        String id = dto.getId();
        PromptTemplate promptTemplate = mapper.selectById(id);
        if (promptTemplate == null){
            throw new BusinessException("模板不存在");
        }
        if (promptTemplate.getDelFlag() == 0){
            throw new BusinessException("模板已被删除");
        }
        if (promptTemplate.getStatus() == 1){
            throw new BusinessException("模板已发布无法修改");
        }
        PromptTemplate update = new PromptTemplate();
        update.setId(id);
        update.setPrompt(dto.getPrompt());
        update.setPrologue(dto.getPrologue());
        mapper.updateById(update);
    }

    @Override
    public void publishDetail(PromptUpdateDetailDTO dto) {
        String id = dto.getId();
        PromptTemplate promptTemplate = mapper.selectById(id);
        if (promptTemplate == null){
            throw new BusinessException("模板不存在");
        }
        if (promptTemplate.getDelFlag() == 0){
            throw new BusinessException("模板已被删除");
        }
        PromptTemplate update = new PromptTemplate();
        update.setId(id);
        update.setPrompt(dto.getPrompt());
        update.setPrologue(dto.getPrologue());
        update.setStatus(1);
        mapper.updateById(update);
    }
}
